/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Services.GrupoService;

import Services.AppService;
import dataBase.HibernateUtil;
import exeptions.GeneralException;
import exeptions.MsgException;
import java.util.ArrayList;
import java.util.List;
import mapeos.Grupo;
import mapeos.Usuario;
import mapeos.Usuariogrupo;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.exception.ConstraintViolationException;

/**
 *
 * @author ivanpianetti
 */
public class GrupoService implements IGrupoService {

    private static IGrupoService unGrupo;

    public static IGrupoService getInstance() {
        if (unGrupo == null || !(unGrupo instanceof IGrupoService)) {
            unGrupo = new GrupoService();
        }
        return unGrupo;
    }

    public List<Grupo> getAll() throws GeneralException {
        List<Grupo> usuarios = null;
        Session s = HibernateUtil.currentSession();
        try {
            Transaction t = s.beginTransaction();
            usuarios = (List<Grupo>) s.createCriteria(Grupo.class).list();
        } catch (HibernateException he) {
            throw new HibernateException(he);
        } finally {
            if (s.isOpen()) {
                s.close();
            }
        }
        return usuarios;
    }

    /**
     * Obtiene todos los Grupos al que pertenezca un Usuario
     * @param pUsuario
     * @return
     * @throws GeneralException 
     */
    public List<Grupo> getAllByUsuario(Usuario pUsuario) throws GeneralException {
        List<Grupo> listaGrupos = new ArrayList<Grupo>();
        List<Usuariogrupo> listaUsuariosGrupos = AppService.getInstance().getUsuarioGrupoService().getAllByUsuario(pUsuario);
        for (Usuariogrupo usuariogrupo : listaUsuariosGrupos) {
            listaGrupos.add(usuariogrupo.getGrupo());
        }
        return listaGrupos;
    }

    public void insert(Grupo grupo) throws GeneralException {
        Session s = HibernateUtil.currentSession();
        try {
            Transaction t = s.beginTransaction();
            s.save(grupo);
            t.commit();
        } catch (ConstraintViolationException he) {
            throw new GeneralException(MsgException.getMsgException("ERROR?", he));
        } catch (HibernateException he) {
            throw new HibernateException(he);
        } finally {
            if (s.isOpen()) {
                s.close();
            }
        }
    }
}
